C++ inline 的函数 声明和实现能否分开?

您所在的位置:网站首页 c++ inline circle circle C++ inline 的函数 声明和实现能否分开?

C++ inline 的函数 声明和实现能否分开?

#C++ inline 的函数 声明和实现能否分开?| 来源: 网络整理| 查看: 265

可以这么声明,不会编译错误,但是在别的translation unit里就inline不了了。原因是一个函数要inline,编译器必须见过它的实现,否则编译器无米之炊无法inline。

具体点说就是这样,来举个天津栗子,在foo.h里你声明一个inline function:

inline int foo();

在foo.cpp里实现之,

#include "foo.h" int foo() { return 233; }

然后在另外一个TU,bar.cpp里去调用它,

#include "foo.h" int bar() { return foo(); }

然后问题来了,C/C++的编译器的工作方式是对每个c/cpp/cc……文件(也就是一个translation unit)分别预处理、编译,最后再链接到一起,于是你看到的是3个文件,编译器看到的是俩,而且看这俩文件的是两个分开的C++编译器进程:

// 预处理过的foo.cpp inline int foo(); int foo() { return 233; }

// 预处理过的bar.cpp inline int foo(); int bar() { return foo(); //编译器:inline? Show me the code! }

很明显,在编译预处理过的bar.cpp的时候,编译器只见到了一个函数foo的声明,虽然脑袋上有个inline,但是并没有定义。于是尽管编译器可以选择是否真的inline,但在这里是无可选择的,没有代码,inline个啥。只能处理成调用,然后等着链接器去链啦。

当然,即使分开TU,想要inline也是可以做到的,方法是开启LTO(Link Time Optimization)然后祈祷编译器大神快快显灵。好在只要你没犯错,函数也确实适合inline,大神通常是会显灵的。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3